package com.ocean.divideandconquer.easy;

/**
 * 当一个字符串 s包含的每一种字母的大写和小写形式 同时出现在 s中，就称这个字符串s是 美好 字符串。比方说，"abABB"是美好字符串，因为'A' 和'a'同时出现了，且'B' 和'b'也同时出现了
 * 。然而，"abA"不是美好字符串因为'b'出现了，而'B'没有出现。
 * <p>
 * 给你一个字符串s，请你返回s最长的美好子字符串。如果有多个答案，请你返回最早出现的一个。如果不存在美好子字符串，请你返回一个空字符串。
 * <p>
 * <p>
 * <p>
 * 示例 1：
 * <p>
 * 输入：s = "YazaAay"
 * 输出："aAa"
 * 解释："aAa" 是一个美好字符串，因为这个子串中仅含一种字母，其小写形式 'a' 和大写形式 'A' 也同时出现了。
 * "aAa" 是最长的美好子字符串。
 * 示例 2：
 * <p>
 * 输入：s = "Bb"
 * 输出："Bb"
 * 解释："Bb" 是美好字符串，因为 'B' 和 'b' 都出现了。整个字符串也是原字符串的子字符串。
 * 示例 3：
 * <p>
 * 输入：s = "c"
 * 输出：""
 * 解释：没有美好子字符串。
 * 示例 4：
 * <p>
 * 输入：s = "dDzeE"
 * 输出："dD"
 * 解释："dD" 和 "eE" 都是最长美好子字符串。
 * 由于有多个美好子字符串，返回 "dD" ，因为它出现得最早。
 *  
 * <p>
 * 提示：
 * <p>
 * 1 <= s.length <= 100
 * s 只包含大写和小写英文字母。
 *
 * @author linmiaolai@sanyygp.com<br>
 * @version 1.0<br>
 * @date 2023/02/28 <br>
 */
public class LongestNiceSubstring {

    public static void main(String[] args) {
        LongestNiceSubstring niceSubstring = new LongestNiceSubstring();
        niceSubstring.longestNiceSubstring("");
    }
    public String longestNiceSubstring(String s) {
        System.out.println('B' - 'b');
        return "";
    }


    class Solution {
        private int maxPos;
        private int maxLen;

        public String longestNiceSubstring(String s) {
            this.maxPos = 0;
            this.maxLen = 0;
            dfs(s, 0, s.length() - 1);
            return s.substring(maxPos, maxPos + maxLen);
        }

        public void dfs(String s, int start, int end) {
            if (start >= end) {
                return;
            }
            int lower = 0, upper = 0;
            for (int i = start; i <= end; ++i) {
                if (Character.isLowerCase(s.charAt(i))) {
                    lower |= 1 << (s.charAt(i) - 'a');
                } else {
                    upper |= 1 << (s.charAt(i) - 'A');
                }
            }
            if (lower == upper) {
                if (end - start + 1 > maxLen) {
                    maxPos = start;
                    maxLen = end - start + 1;
                }
                return;
            }
            int valid = lower & upper;
            int pos = start;
            while (pos <= end) {
                start = pos;
                while (pos <= end && (valid & (1 << Character.toLowerCase(s.charAt(pos)) - 'a')) != 0) {
                    ++pos;
                }
                dfs(s, start, pos - 1);
                ++pos;
            }
        }
    }


}
